import { login, logout, getInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import router, { resetRouter } from '@/router'
import { Message } from 'element-ui'

const state = {
    token: getToken(),
    name: '',
    nickName:'',
    avatar: '',
    introduction: '',
    roles: [],
    permissions: []
}

const mutations = {
    SET_TOKEN: (state, token) => {
        state.token = token
    },
    SET_INTRODUCTION: (state, introduction) => {
        state.introduction = introduction
    },
    SET_NAME: (state, name) => {
        state.name = name
    },
    SET_NICKNAME: (state, name) => {
        state.nickName = name
    },
    SET_AVATAR: (state, avatar) => {
        state.avatar = avatar
    },
    SET_ROLES: (state, roles) => {
        state.roles = roles
    },
    SET_PERMISSIONS: (state, permissions) => {
        state.permissions = permissions;
    },
}

const actions = {
    // user login
    login({ commit }, userInfo) {
        // const { username, password } = userInfo
        return new Promise((resolve, reject) => {
            login(userInfo).then(response => {
                if(response.code == 200){
                    commit('SET_TOKEN', response.token)
                    setToken(response.token)
                }else{
                    Message({
                        message: response.msg,
                        type: 'error',
                        duration: 5 * 1000
                      })
                }
                resolve()
            }).catch(error => {
                reject(error)
            })
        })
    },

    // get user info
    getInfo({ commit, state }) {
        return new Promise((resolve, reject) => {
            getInfo(state.token).then(response => {
                localStorage.setItem('userInfo', JSON.stringify(response.user))
                    // const { data } = response
                    // if (!data) {
                    //   reject('Verification failed, please Login again.')
                    // }

                // const { roles, name, avatar, introduction } = response

                // roles must be a non-empty array
                if (!response.roles || response.roles.length <= 0) {
                    reject('getInfo: roles must be a non-null array!')
                }
                commit("SET_PERMISSIONS", response.permissions);
                commit('SET_ROLES', response.roles)
                commit('SET_NAME', response.user.userName)
                commit('SET_NICKNAME', response.user.nickName)
                if(response.user.avatar){
                    
                    commit('SET_AVATAR', response.user.avatar)
                }else{
                    commit('SET_AVATAR', require("@/assets/images/profile.png"))
                }
                    // commit('SET_INTRODUCTION', introduction)
                resolve(response)
            }).catch(error => {
                reject(error)
            })
        })
    },

    // user logout
    logout({ commit, state, dispatch }) {
        return new Promise((resolve, reject) => {
            // logout(state.token).then(() => {
                commit('SET_TOKEN', '')
                commit('SET_ROLES', [])
                removeToken()
                resetRouter()

                // reset visited views and cached views
                // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
                dispatch('tagsView/delAllViews', null, { root: true })

                resolve()
            // }).catch(error => {
            //     reject(error)
            // })
        })
    },

    // remove token
    resetToken({ commit }) {
        return new Promise(resolve => {
            commit('SET_TOKEN', '')
            commit('SET_ROLES', [])
            removeToken()
            resolve()
        })
    },

    // dynamically modify permissions
    async changeRoles({ commit, dispatch }, role) {
        const token = role + '-token'

        commit('SET_TOKEN', token)
        setToken(token)

        const { roles } = await dispatch('getInfo')

        resetRouter()

        // generate accessible routes map based on roles
        const accessRoutes = await dispatch('permission/generateRoutes', roles, { root: true })
            // dynamically add accessible routes
        router.addRoutes(accessRoutes)

        // reset visited views and cached views
        dispatch('tagsView/delAllViews', null, { root: true })
    }
}

export default {
    namespaced: true,
    state,
    mutations,
    actions
}